package com.example.litehdfs.service.impl;

import java.util.Date;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.example.litehdfs.config.B2BServiceException;
import com.example.litehdfs.config.CodeConstant;
import com.example.litehdfs.mapper.UserFileRelationMapper;
import com.example.litehdfs.mapper.UsersMapper;
import com.example.litehdfs.model.dto.UserFileInfo;
import com.example.litehdfs.service.LiteHdfsService;
import com.example.litehdfs.util.UserCacheUtil;

import cn.hutool.core.io.file.FileNameUtil;



@Service
public class LiteHdfsServiceImpl implements LiteHdfsService {

	@Autowired
	private UserCacheUtil cacheUtil;
	@Autowired
	private UsersMapper usersMapper;
	@Autowired
	private UserFileRelationMapper userFileRelationMapper;
	
	@Value("${server-root}")
	private String serverRoot;

	@Override
	public void downloadFile(HttpServletResponse resp, String fileName) {
		// TODO Auto-generated method stub
		//校验登录
		Long userId = cacheUtil.getUserId();
		if(userId == null) {
			throw new B2BServiceException(CodeConstant.LOGIN_ERROR,"请重新登录");
		}
		//文件名和扩展名
		String fileUuid = FileNameUtil.mainName(fileName);
		String extName = FileNameUtil.extName(fileName);
		
//		校验：
//		1.检验当时用户的此文件是否存在
		UserFileInfo userFile = userFileRelationMapper.getUserFileByUuid(userId, fileUuid);
		if(userFile == null) {
			throw new B2BServiceException("文件不存在");
		}
//		2.判断文件是否有过期时间，过期直接抛异常：文件已过期；
		if(userFile.getExpirationTime() != null && userFile.getExpirationTime().compareTo(new Date()) < 0) {
//			TODO
//			 如果本地缓存存在，则删除，
//			并且将此文件状态更新为已删除，再添加到任务表（状态待删除） 
			throw new B2BServiceException("文件已过期");
		}

//		下载流程
//		根据用户文件信息，判断本地缓存文件是否存在，且判断文件大小是否一致，要是一致，说明文件完整，则返回；
//		不一致，则删除本地缓存，再下载hdfs文件到本地缓存


//		注：此下载流程可以优化，考虑新增加断点续传功能：
//           如果请求参数包含文件偏移量，则调用hdfs读取文件偏移量的方法，返给前端文件流

	}
	

	
	
}
